home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / faq-s.zip / GENERAL.PAS < prev    next >
Pascal/Delphi Source File  |  1991-01-06  |  6KB  |  298 lines

  1.  
  2. unit general;
  3.  
  4. interface
  5.  
  6. uses dos,types;
  7.  
  8. function strr (n:integer):mstr;
  9. function streal (r:real):mstr;
  10. function strlong (l:longint):mstr;
  11. function valu (q:mstr):integer;
  12. function valul (q:mstr):longint;
  13. function addrstr (p:pointer):sstr;
  14. procedure parse3 (s:lstr; var a,b,c:word);
  15. function packtime (var dt:datetime):longint;
  16. function now:longint;
  17. function timestr (time:longint):sstr;
  18. function timeval (opps:sstr):longint;
  19. function timepart (time:longint):longint;
  20. function datestr (time:longint):sstr;
  21. function dateval (q:sstr):longint;
  22. function datepart (date:longint):longint;
  23. function upstring (s:anystr):anystr;
  24. function match (s1,s2:anystr):boolean;
  25. function devicename (it:lstr):boolean;
  26. function exist (te:lstr):boolean;
  27. procedure appendfile (name:lstr; var q:text);
  28. procedure addexitproc (p:pointer);
  29. procedure doneexitproc;
  30.  
  31. implementation
  32.  
  33. const maxexitprocs=25;
  34.  
  35. var exitstack:array [1..maxexitprocs] of pointer;
  36.     exitstackptr:integer;
  37.  
  38. type packedtimerec=record
  39.        date,time:word
  40.      end;
  41.  
  42. function strr (n:integer):mstr;
  43. var q:mstr;
  44. begin
  45.   str (n,q);
  46.   strr:=q
  47. end;
  48.  
  49. function streal (r:real):mstr;
  50. var q:mstr;
  51. begin
  52.   str (r:0:0,q);
  53.   streal:=q
  54. end;
  55.  
  56. function strlong (l:longint):mstr;
  57. var v:mstr;
  58. begin
  59.   str (l,v);
  60.   strlong:=v
  61. end;
  62.  
  63. function valu (q:mstr):integer;
  64. var i,s,pu:integer;
  65.     r:real;
  66. begin
  67.   valu:=0;
  68.   if length(q)=0 then exit;
  69.   if not (q[1] in ['0'..'9','-']) then exit;
  70.   if length(q)>5 then exit;
  71.   val (q,r,s);
  72.   if s<>0 then exit;
  73.   if (r<=32767.0) and (r>=-32767.0)
  74.     then valu:=round(r)
  75. end;
  76.  
  77. function valul (q:mstr):longint;
  78. var i,s,pu:integer;
  79.     r:real;
  80. begin
  81.   valul:=0;
  82.   if length(q)=0 then exit;
  83.   if not (q[1] in ['0'..'9','-']) then exit;
  84.   if pos(' ',q)<>0 then q:=copy(q,1,pos(' ',q)-1);
  85.   val (q,r,s);
  86.   if s<>0 then exit;
  87.   valul:=round(r)
  88. end;
  89.  
  90. function addrstr (p:pointer):sstr;
  91.  
  92.   function hexstr (n:integer):sstr;
  93.  
  94.     function hexbytestr (b:byte):sstr;
  95.     const hexchars:array[0..15] of char='0123456789ABCDEF';
  96.     begin
  97.       hexbytestr:=hexchars[b shr 4]+hexchars[b and 15]
  98.     end;
  99.  
  100.   begin
  101.     hexstr:=hexbytestr (hi(n))+hexbytestr(lo(n))
  102.   end;
  103.  
  104. begin
  105.   addrstr:=hexstr(seg(p^))+':'+hexstr(ofs(p^))
  106. end;
  107.  
  108. procedure parse3 (s:lstr; var a,b,c:word);
  109. var p:integer;
  110.  
  111.   procedure parse1 (var n:word);
  112.   var ns:lstr;
  113.   begin
  114.     ns[0]:=#0;
  115.     while (p<=length(s)) and (s[p] in ['0'..'9']) do begin
  116.       ns:=ns+s[p];
  117.       p:=p+1
  118.     end;
  119.     if length(ns)=0
  120.       then n:=0
  121.       else n:=valu(ns);
  122.     if p<length(s) then p:=p+1
  123.   end;
  124.  
  125. begin
  126.   p:=1;
  127.   parse1 (a);
  128.   parse1 (b);
  129.   parse1 (c)
  130. end;
  131.  
  132. function packtime (var dt:datetime):longint;
  133. var l:longint;
  134. begin
  135.   dos.packtime (dt,l);
  136.   packtime:=l
  137. end;
  138.  
  139. function now:longint;
  140. var dt:datetime;
  141.     t:word;
  142.     l:longint;
  143. begin
  144.   gettime (dt.hour,dt.min,dt.sec,t);
  145.   getdate (dt.year,dt.month,dt.day,t);
  146.   l:=packtime (dt);
  147.   now:=l
  148. end;
  149.  
  150. function timestr (time:longint):sstr;
  151. var h1:integer;
  152.     ms:sstr;
  153.     dt:datetime;
  154. const ampmstr:array [false..true] of string[2]=('am','pm');
  155. begin
  156.   unpacktime (time,dt);
  157.   h1:=dt.hour;
  158.   if h1=0
  159.     then h1:=12
  160.     else if h1>12
  161.       then h1:=h1-12;
  162.   ms:=strr(dt.min);
  163.   if dt.min<10 then ms:='0'+ms;
  164.   timestr:=strr(h1)+':'+ms+' '+ampmstr[dt.hour>11]
  165. end;
  166.  
  167. function datestr (time:longint):sstr;
  168. var dt:datetime;
  169. begin
  170.   unpacktime (time,dt);
  171.   datestr:=strr(dt.month)+'/'+strr(dt.day)+'/'+strr(dt.year-1900)
  172. end;
  173.  
  174. function timepart (time:longint):longint;
  175. begin
  176.   timepart:=time and $0000ffff;
  177. end;
  178.  
  179. function datepart (date:longint):longint;
  180. begin
  181.   datepart:=date and $ffff0000;
  182. end;
  183.  
  184. procedure cleardatetime (var dt:datetime);
  185. begin
  186.   unpacktime (0,dt)
  187. end;
  188.  
  189. function timeval (opps:sstr):longint;
  190. var h1,t:word;
  191.     k:char;
  192.     dt:datetime;
  193. begin
  194.   cleardatetime (dt);
  195.   parse3 (opps,h1,dt.min,t);
  196.   k:=upcase(opps[length(opps)-1]);
  197.   if h1 in [1..11] then begin
  198.      dt.hour:=h1;
  199.      if k='P' then dt.hour:=dt.hour+12
  200.   end else if k='P'
  201.    then dt.hour:=12
  202.   else dt.hour:=0;
  203.   timeval:=timepart(packtime(dt))
  204. end;
  205.  
  206. function dateval (q:sstr):longint;
  207. var dt:datetime;
  208. begin
  209.   cleardatetime (dt);
  210.   parse3 (q,dt.month,dt.day,dt.year);
  211.   if ((dt.year<100) and (dt.year>00)) then dt.year:=dt.year+1900;
  212.   dateval:=datepart(packtime(dt))
  213. end;
  214.  
  215. function upstring (s:anystr):anystr;
  216. var cnt:integer;
  217. begin
  218.   for cnt:=1 to length(s) do s[cnt]:=upcase(s[cnt]);
  219.   upstring:=s
  220. end;
  221.  
  222. function match (s1,s2:anystr):boolean;
  223. var cnt:integer;
  224. begin
  225.   match:=false;
  226.   if length(s1)<>length(s2) then exit;
  227.   for cnt:=1 to length(s1) do
  228.     if upcase(s1[cnt])<>upcase(s2[cnt]) then exit;
  229.   match:=true
  230. end;
  231.  
  232. function devicename (it:lstr):boolean;
  233. var f:file;
  234.     n:integer absolute f;
  235.     r:registers;
  236. begin
  237.   devicename:=false;
  238.   assign (f,it);
  239.   reset (f);
  240.   if ioresult<>0 then exit;
  241.   r.bx:=n;
  242.   r.ax:=$4400;
  243.   intr ($21,r);
  244.   devicename:=(r.dx and 128)=128;
  245.   close (f)
  246. end;
  247.  
  248. function exist (te:lstr):boolean;
  249. var f:file;
  250.     i:integer;
  251. begin
  252.   assign (f,te);
  253.   reset (f);
  254.   i:=ioresult;
  255.   exist:=i=0;
  256.   close (f);
  257.   i:=ioresult
  258. end;
  259.  
  260. procedure appendfile (name:lstr; var q:text);
  261. var n:integer;
  262.     b:boolean;
  263.     f:file of char;
  264. begin
  265.   close (q);
  266.   n:=ioresult;
  267.   assign (q,name);
  268.   assign (f,name);
  269.   reset (f);
  270.   b:=(ioresult<>0) or (filesize(f)=0);
  271.   close (f);
  272.   n:=ioresult;
  273.   if b
  274.     then rewrite (q)
  275.     else append (q)
  276. end;
  277.  
  278. procedure addexitproc (p:pointer);
  279. begin
  280.   inc (exitstackptr);
  281.   if exitstackptr>maxexitprocs then begin
  282.     writeln ('Too many exit procedures');
  283.     halt (255)
  284.   end else begin
  285.     exitstack[exitstackptr]:=exitproc;
  286.     exitproc:=p
  287.   end
  288. end;
  289.  
  290. procedure doneexitproc;
  291. begin
  292.   exitproc:=exitstack[exitstackptr];
  293.   dec (exitstackptr)
  294. end;
  295.  
  296. begin
  297.   exitstackptr:=0
  298. end.